package cho114366.basic;

public class J12_Sungjuk_v4b {

	public static void main(String[] args) {
		// 접근 지정자를 이용해서 SungJuk 클래스 정의
		J12SungJuk sj = new J12SungJuk();
		// sj.name="지현";
		// name 멤버변수는 접근지정자가 private이므로
		// 위코드처럼 작성하면 오류 발생
		sj = new J12SungJuk("지현", 98, 45, 12);
		// 어쩔수 없이 생성자를 이용해서
		// name,kor,eng,mat 멤버변수를 초기화 함

		// System.out.println(sj.name);
		// 하지만, 기존 방식으로 name 변수를 출력해도
		// private 접근지정자 떄문에 오류발생

		// 따라서, private 으로 선언된 멤버변수를
		// 조작하거나 값을 읽어올려면
		// 그것을 위한 특별한 메서드를 작성하는 것이 좋음
		// 실무에서는 setter/getter 메서드를 작성함
		// sj.setName("수지");
		// sj.setkor(90);
		// sj.seteng(80);
		// sj.setmat(70);
		// sj.settot(sj.getkor() + sj.getmat() + sj.geteng());
		// sj.setavg(sj.gettot() / 3);
		// sj.setgrd('수');
//		 System.out.println(sj.getName());
//		 System.out.println(sj.getkor());
//		 System.out.println(sj.geteng());
//		 System.out.println(sj.getmat());
//		 System.out.println(sj.gettot());
//		 System.out.println(sj.getavg());

		// System.out.println(sj.getgrd()); // 주의 return 값이 없음
		// toString()메서드를 이용해서
		// 객체의 모든 멤버변수 출력하기
		System.out.println(sj.toString());

	}// main

}// class

class J12SungJuk {
	private String name;
	private int kor;
	private int eng;
	private int mat;

	private int tot;
	private double avg;
	private char grd;

	public J12SungJuk() {
	}

	public J12SungJuk(String name, int kor, int eng, int mat) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;

	}

	// setter 메서드 : 멤버변수에 값을 set하기 위한 메서드
	// public void set멤버변수(자료형 멤버변수명){
	// this.멤버변수명=멤버변수명;
	// }
	public void setName(String name) {
		this.name = name;
	}

	public void setkor(int kor) {
		this.kor = kor;
	}

	public void seteng(int eng) {
		this.eng = eng;
	}

	public void setmat(int mat) {
		this.mat = mat;
	}

	public void settot(int tot) {
		this.tot = tot;
	}

	public void setavg(double avg) {
		this.avg = avg;
	}

	public void setgrd(char grd) {
		this.grd = grd;
	}

	// getter 메서드 : 멤버변수의 값을 get하기 위한 메서드
	// public 멤버변수자료형 get멤버변수명(){
	// return 멤버변수명;
	// }
	public String getName() {
		return name;
	}

	public int getkor() {
		return kor;
	}

	public int geteng() {
		return eng;
	}

	public int getmat() {
		return mat;
	}

	public int gettot() {
		tot = kor + eng + mat;
		return tot;
	}

	public double getavg() {
		avg = gettot() / 3;
		return avg;
	}

	public char getgrd() {
		switch ((int) (gettot() / 3)) {
		case 10:
		case 9:
			grd = '수';
			break;
		default:
			grd = '우';

		}
		return grd;
	}

	/*
	 * int getTotal() {// 아래의 수식의 유형을 int로 쓴다 tot = kor + eng + mat; return
	 * tot;// return 값을 int형태로 바꿈 }
	 * 
	 * double gerAvg() { // int imsi = getTotal(); // avg = imsi/3; avg =
	 * getTotal() / 3; return avg; }
	 * 
	 * void getGrade() { switch ((int) (getTotal() / 3)) { case 10: case 9: grd
	 * = '수'; break; default: grd = '우';
	 * 
	 * } }// 메서드의 반환값 유형을 결과값의 종류에 따라 지정
	 */

	// 객체지향 프로그래밍에서는
	// 메서드에 너무 많은 책임을 부여하는 것을
	// 금지하고 있음
	// getTot 메서드를 살펴보면
	// 단순히 tot 변수의 값을 읽어오는 기능외에
	// 입력한 성적데이터에 대한 총점을 구하는 기능도 포함

	public int getTot() {
		tot = kor + eng + mat;
		settot(kor + eng + mat);
		return tot;
	}

	public double getAvg() {
		avg = tot / 3;
		return avg;
	}

	public char getGrd() {
		switch ((int) avg / 10) {
		case 10:
		case 9:
			grd = '수';
			break;
		case 8:
			grd = '우';
			break;
		case 7:
			grd = '미';
			break;
		case 6:
			grd = '양';
			break;
		default:
			grd = '가';
			break;

		}
		return grd;
	}

	// 멤버변수의 모든 값을 출력하기 위해
	// Object 클래스에서 기본으로 제공하는
	// 메서드인 toString()을 재정의 override
	@Override
	// 어노테이션 : 컴파일러를 위한 주석
	public String toString() {
		String result = "";
		result = result + "이름:" + name;
		result += "국어:" + kor;
		result += "영어:" + eng;
		result += "수학:" + mat;
		result += "총점" + gettot();
		result += "평균" + getavg();
		result += "성적" + getgrd();
		return result;

		// return super.toString();
	}
}
